package com.myzl.stream.config;

import com.myzl.common.config.VideoConfig;
import com.myzl.stream.util.ffmpeg.FfmpegUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;

/**
 * 转换视频流
 * @author cew
 */
@Slf4j(topic = "admin-steam")
@Component
public class ConversionVideo {

    @Autowired
    private StreamGobbler errorGobbler;

    /**
     * 推流
     * @param videoUrl 推流视频地址
     * @param controllerUrl rtmp地址
     * @param flvUrl 前端播放地址
     * @return 播放地址
     */
    public String pushVideoAsRTSP(String videoUrl, String controllerUrl,String flvUrl){
        //ffmpeg.exe -rtsp_transport tcp -buffer_size 4096000 -i "rtsp://admin:hc@123456@192.168.1.70:554/Streaming/Channels/1?videoCodecType=H.264" -vcodec copy -acodec copy -f flv "rtmp://127.0.0.1:1935/live/88"
        Process process = FfmpegUtil.getProcess(videoUrl);
        // 已经在推送了不需要进行操作
        if(!ObjectUtils.isEmpty(process)){
            return FfmpegUtil.getPlayUrl(videoUrl);
        }
        destroy(videoUrl);
        // 获取ffmpeg位置 根据操作系统读取配置
        String ffmpegPath = VideoConfig.getFfmpegPath();
        try {
            // cmd命令拼接，注意命令中存在空格
            StringBuilder command = new StringBuilder(ffmpegPath) ;
            // ffmpeg开头
            command .append(" -rtsp_transport tcp");
            // 减少卡顿或者花屏现象，相当于增加或扩大了缓冲区，给予编码和发送足够的时间。
            command .append(" -buffer_size 4096000");
            // 指定要推送的视频
            command .append(" -i ").append(videoUrl);
            // fps 设置帧频 缺省25
            command .append(" -r 30 ");
            // 音频选项， 一般后面加copy表示拷贝
            command .append(" -vcodec copy");
            // 音频选项， 一般后面加copy表示拷贝
            command .append(" -acodec copy");
            // 指定推送服务器，-f：指定格式
            command .append(" -f flv ").append(controllerUrl);

            log.info("ffmpeg推流命令：{}", command);
            // 运行cmd命令，获取其进程
            process = Runtime.getRuntime().exec(command.toString());
            //这里处理process的信息
            errorGobbler.run(process.getErrorStream(), "Error",videoUrl);
            log.info("开始推流：{}",controllerUrl);
            FfmpegUtil.push(videoUrl,flvUrl,process);
        }catch (Exception e){
            log.error("推流出现异常：",e);
        }
        return flvUrl;
    }

    public boolean keepLive(String videoUrl){
        return FfmpegUtil.keepLive(videoUrl);
    }

    public boolean destroy(String videoUrl){
        return FfmpegUtil.destroy(videoUrl);
    }

}
